//#include <iostream>
//#include <cstring>
//#include <cmath>
//using namespace std;
//
//const int N = 1010;
//
//int n;
//int m = 5000;
//int a[N] = { 0 };
//
//int f[N][10010] = { 0 };
//
//int main()
//{
//	cin >> n;
//	for (int i = 1; i <= n; i++)
//	{
//		int x, y;
//		cin >> x >> y;
//		a[i] = x - y;
//	}
//
//	memset(f, 0x3f, sizeof(f));
//
//	f[0][0 + m] = 0;
//	
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = -m; j <= m; j++)
//		{
//			f[i][j + m] = min(f[i - 1][j - a[i] + m], f[i - 1][j + a[i] + m] + 1);
//		}
//	}
//
//	int ret = 0x3f3f3f3f;
//	for (int i = 0; i <= m; i++)
//	{
//		ret = min(abs(f[n][i + m]), abs(f[n][-i + m]));
//		if (ret != 0x3f3f3f3f)
//			break;
//	}
//	
//	cout << ret << endl;
//
//
//	return 0;
//}



//#include <iostream>
//using namespace std;
//
//const int N = 60;
//
//int n, m;
//int a[N][N] = { 0 };
//
//int f[2 * N][N][N] = { 0 };
//
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= m; j++)
//		{
//			cin >> a[i][j];
//		}
//	}
//
//	for (int len = 1; len <= n + m; len++)
//	{
//		for (int i1 = 1; i1 <= n; i1++)
//		{
//			for (int i2 = 1; i2 <= n; i2++)
//			{
//				if (i1 == i2 && len != n + m)
//					continue;
//
//				int j1 = len - i1;
//				int j2 = len - i2;
//				if (j1 <= 0 || j1 > m || j2 <= 0 || j2 > m)
//					continue;
//
//				int w = a[i1][j1] + a[i2][j2];
//				f[len][i1][i2] = max(f[len][i1][i2], f[len - 1][i1][i2] + w);
//				f[len][i1][i2] = max(f[len][i1][i2], f[len - 1][i1 - 1][i2] + w);
//				f[len][i1][i2] = max(f[len][i1][i2], f[len - 1][i1][i2 - 1] + w);
//				f[len][i1][i2] = max(f[len][i1][i2], f[len - 1][i1 - 1][i2 - 1] + w);
//			}
//		}
//	}
//
//	cout << f[n + m][n][n];
//
//	return 0;
//}




//#include <iostream>
//#include <set>
//using namespace std;
//
//const int N = 10010;
//
//set<pair<int, int>> mp;
//int a[N] = { 0 };
//int n, I, H, R;
//
//int main()
//{
//	cin >> n >> I >> H >> R;
//
//	a[0] += H;
//	a[n + 1] -= H;
//
//	for (int i = 1; i <= R; i++)
//	{
//		int x, y;
//		cin >> x >> y;
// 
//		if (x > y)
//			swap(x, y);
//
//		mp.insert({ x, y });
//	}
//
//	for (auto ch : mp)
//	{
//		a[ch.first + 1]--;
//		a[ch.second]++;
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		a[i] = a[i] + a[i - 1];
//	}
//
//	a[I] = H;
//
//	for (int i = 1; i <= n; i++)
//	{
//		cout << a[i] << endl;
//	}
//
//	return 0;
//}


#include <iostream>
using namespace std;

const int N = 25;

int f[N] = { 0 };
int pre[N] = { 0 };
int a[N] = { 0 };
int e[N][N] = { 0 };

int n;

void dfs(int x)
{
	if (x)
	{
		dfs(pre[x]);
		cout << x << " ";
	}

}

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}

	for (int i = 1; i < n; i++)
	{
		for (int j = i + 1; j <= n; j++)
		{
			cin >> e[i][j];
		}
	}

	for (int i = 1; i <= n; i++)
	{
		f[i] = a[i];
		for (int j = 1; j < i; j++)
		{
			if (e[j][i] && f[j] + a[i] > f[i])
			{
				pre[i] = j;
				f[i] = f[j] + a[i];
			}
		}
	}

	int ret = 0;
	int pos = 0;
	for (int i = 1; i <= n; i++)
	{
		if (f[i] > ret)
		{
			ret = f[i];
			pos = i;
		}
	}

	dfs(pos);
	cout << endl;
	cout << ret << endl;

	return 0;
}